const app = getApp()
const networkHelper = require('./network-helper')

/**
 * 网络请求封装
 * @param {Object} options 请求参数
 */
function request(options) {
  return new Promise((resolve, reject) => {
    const { url, method = 'GET', data = {}, header = {} } = options
    
    // 获取token
    const token = wx.getStorageSync('token')
    
    // 设置请求头
    const requestHeader = {
      'Content-Type': 'application/json',
      ...header
    }
    
    // 如果有token，添加到请求头
    if (token) {
      requestHeader['Authorization'] = `Bearer ${token}`
    }
    
    // 显示加载提示
    wx.showLoading({
      title: '加载中...',
      mask: true
    })
    
    // 完整的请求URL
    const fullUrl = `${app.globalData.baseUrl}${url}`
    console.log('请求URL:', fullUrl)
    console.log('请求方法:', method)
    console.log('请求数据:', data)
    
    wx.request({
      url: fullUrl,
      method: method,
      data: data,
      header: requestHeader,
      timeout: 10000, // 10秒超时
      success: (res) => {
        wx.hideLoading()
        console.log('请求成功:', res)
        
        if (res.statusCode === 200) {
          const { code, data, message } = res.data
          
          if (code === 200) {
            // 成功时直接返回data，保持向后兼容
            resolve(data)
          } else if (code === 401) {
            // token过期，清除登录状态并跳转到登录页
            app.clearLoginStatus()
            wx.showToast({
              title: '登录已过期，请重新登录',
              icon: 'none'
            })
            setTimeout(() => {
              wx.redirectTo({
                url: '/pages/auth/login/login'
              })
            }, 1500)
            reject(new Error(message || '登录已过期'))
          } else {
            // 其他业务错误
            const errorMsg = message || '请求失败'
            console.error('业务错误:', code, errorMsg)
            reject(new Error(errorMsg))
          }
        } else if (res.statusCode === 401) {
          // HTTP 401 未授权，token过期或无效
          app.clearLoginStatus()
          wx.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none'
          })
          setTimeout(() => {
            wx.redirectTo({
              url: '/pages/auth/login/login'
            })
          }, 1500)
          reject(new Error('登录已过期'))
        } else {
          // 其他HTTP状态码错误
          const errorMsg = `HTTP ${res.statusCode}: ${res.data?.message || '网络请求失败'}`
          console.error('HTTP错误:', errorMsg)
          reject(new Error(errorMsg))
        }
      },
      fail: (error) => {
        wx.hideLoading()
        console.error('请求失败:', error)
        
        // 显示友好的错误提示
        networkHelper.showNetworkError(error)
        
        // 如果是域名错误，输出开发提示
        if (error.errMsg && error.errMsg.includes('url not in domain list')) {
          console.error('域名校验失败，请按以下步骤解决：')
          console.error('1. 点击开发者工具右上角的"详情"')
          console.error('2. 在"本地设置"选项卡中')
          console.error('3. 勾选"不校验合法域名、web-view（业务域名）、TLS 版本以及 HTTPS 证书"')
          console.error('4. 重新编译小程序')
          
          // 检查开发环境网络配置
          const networkInfo = networkHelper.checkDevelopmentNetwork()
          console.log('当前环境:', networkInfo)
        }
        
        reject(error)
      }
    })
  })
}

/**
 * GET请求
 */
function get(url, data = {}) {
  return request({
    url,
    method: 'GET',
    data
  })
}

/**
 * POST请求
 */
function post(url, data = {}) {
  return request({
    url,
    method: 'POST',
    data
  })
}

/**
 * PUT请求
 */
function put(url, data = {}) {
  return request({
    url,
    method: 'PUT',
    data
  })
}

/**
 * DELETE请求
 */
function del(url, data = {}) {
  return request({
    url,
    method: 'DELETE',
    data
  })
}

module.exports = {
  request,
  get,
  post,
  put,
  delete: del
} 